package org.me.domain;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.me.entityBeans.TCambioDolar;
import org.me.entityBeans.TClientes;
import org.me.entityBeans.TMonedas;
import org.me.entityBeans.TMontoInteres;
import org.me.entityBeans.TNotarias;
import org.me.entityBeans.TTarjetaPropiedadVehiculos;
import org.me.entityBeans.TTiposDocumentos;
import org.me.service.CambioDolarServiceHibernate;
import org.me.service.ClienteServiceHibernate;
import org.me.service.MonedasServiceHibernate;
import org.me.service.MontoInteresServiceHibernate;
import org.me.service.NotariaServiceHibernate;
import org.me.service.TarjetaPropiedadVehServiceHibernate;
import org.me.service.TipoDeDocumentoServiceHibernate;
import org.me.utileria.Utileria;

//Clase heredada por CreditoVehicularController,CreditoInmobiliarioController,
public class Creditos {
    
   //Se inyectan a Interfaces las implmentaciones, para que no se deba cambiar nada de codigo en los ctes si existen nuevas implementaciones
    private ClienteServiceHibernate clienteServiceHibernateImpl;
    private CambioDolarServiceHibernate cambioDolarServiceHibernateImpl;
    private TarjetaPropiedadVehServiceHibernate tarjetaPropiedadVehServiceHibernateImpl;
    
    private String colorMensajeCredito;
   
    
    //Datos de la vista 
    private String sDolarVentaModal;//tipo String, ya que al enviar una actualizacion de Cambio de Dolar puede que envie con mas de 1 pto
                               // o envie en blanco, desde la vista al JSF y no genere error si JSF kiera convertir  a bigDecimal (Modal de la vista)
                    //Al inicio carga sDolarVenta y sDolarCompra (valores que pintan la vista en la ventana Modal)
                 //Todo esto ya que la validacion no se realiza en la vista x java script, sino q se realiza en el modelo.
    private String sDolarCompraModal;
    private String mensajeCredito;
    private String fechaActual;//formateada solo para mostrarse en la vista
    private String mensajeDolar;
    private String mensajeExisteCte;
    private String colorMensajeExisteCte;
    private Integer dni;
    private String ruc;
    private String nomCliente;
    private String apePaterno;
    private String apeMaterno;
    private BigDecimal montoPrestamo;
    private Short idMoneda;
    private List<SelectItem> listaMonedasSelectItem;
    private BigDecimal interesQuincenal;
    private BigDecimal interesMensual;
    private BigDecimal cuotaQuincenal;
    private BigDecimal cuotaMensual;
    private BigDecimal guardianiaOtros;    
    private  String placa;
    private String nombresPropietario;    
    private String estadoVehiculo;
    private String km;
    //Fin datos de la vista   
    
    
    private Integer idCliente;
    private List<TCambioDolar> listCambioDolar;
    private TCambioDolar cambioDolar;
    private BigDecimal dolarVenta;//para ser mostrado al cargarse la clase y cuando se envia a grabar el Credito (Form principal de la vista)
    private BigDecimal dolarCompra;
    private String colorMensajeDolar;
    private List<TMonedas> listaBeansMonedas;
    private Properties properties;
    private Utileria utileria;
    private MonedasServiceHibernate monedasServiceHibernateImpl;
    private MontoInteresServiceHibernate montoInteresServiceHibernateImpl;
    
    private Short idNotaria;
    private List<SelectItem> listaNotariasSelectItem;
    private NotariaServiceHibernate notariaServiceHibernateImpl;
    private List<TNotarias> listaBeansNotarias;
    
    private Short idTipoDeDocumento;
    private List<SelectItem> listaTiposDeDocumentosSelectItem;
    private TipoDeDocumentoServiceHibernate tipoDeDocumentoServiceHibernateImpl;
    private List<TTiposDocumentos> listaBeansTiposDeDocumentos;
    
    private  String numeroDocumento;
    
    private  int pactado;//cantidad de dias, meses segun escoja el combo
    private  String fechaPactada;
    private String diasMeses;
    
    private String observacionesCreditos;//datos adicionales    
    
    //private TTarjetaPropiedadVehiculos tarjetaPropiedadVeh;
    private List<TTarjetaPropiedadVehiculos> listTarjetaPropiedadVeh;
    
    
    public Creditos(CambioDolarServiceHibernate cambioDolarServiceHibernateImpl, MonedasServiceHibernate monedasServiceHibernateImpl, 
                                   NotariaServiceHibernate notariaServiceHibernateImpl, 
                                   TipoDeDocumentoServiceHibernate tipoDeDocumentoServiceHibernateImpl, Utileria utileria) //La clase hija le pasa cambioDolarServiceHibernateImpl
    
    {
        this.monedasServiceHibernateImpl = monedasServiceHibernateImpl;
        this.cambioDolarServiceHibernateImpl = cambioDolarServiceHibernateImpl;
        this.notariaServiceHibernateImpl = notariaServiceHibernateImpl;
        this.tipoDeDocumentoServiceHibernateImpl = tipoDeDocumentoServiceHibernateImpl;
        this.utileria = utileria;
        
        this.cargarDatosIniciales();//De la vista       

//        this.properties = new Properties();
//        try{
//           this.properties.load(new FileInputStream("resources/messages.properties"));
//        }
//        catch(IOException  e){
//            e.printStackTrace();
//        }       
    }

    private void cargarDatosIniciales() {
        //Fecha actual del sevidor
        //DateFormat dateFormat = new SimpleDateFormat("dd/MMMMMMMMMM/yyyy");
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date date = new Date();
        this.fechaActual = dateFormat.format(date);

        //Cambio Dolar
        this.traerCambioDolar();//dolar tipo BigDecimal para el form Principal y tipo String para la ventana Modal

        //Monedas
        this.listaBeansMonedas = this.monedasServiceHibernateImpl.findAllMonedas();
        this.listaMonedasSelectItem = this.utileria.convertListBeansMonedasToSelectItem(this.listaBeansMonedas); 
        
        //Notarias
        this.listaBeansNotarias = this.notariaServiceHibernateImpl.findAllNotarias();
        this.listaNotariasSelectItem = this.utileria.convertListBeansNotariasToSelectItem(this.listaBeansNotarias);   
        
        //Tipos de Documentos
        this.listaBeansTiposDeDocumentos = this.tipoDeDocumentoServiceHibernateImpl.findAllTiposDeDocumentos();
        this.listaTiposDeDocumentosSelectItem = this.utileria.convertListBeansTiposDeDocumentosToSelectItem(this.listaBeansTiposDeDocumentos);   

    }

    public TarjetaPropiedadVehServiceHibernate getTarjetaPropiedadVehServiceHibernateImpl() {
        return tarjetaPropiedadVehServiceHibernateImpl;
    }

    public void setTarjetaPropiedadVehServiceHibernateImpl(TarjetaPropiedadVehServiceHibernate tarjetaPropiedadVehServiceHibernateImpl) {
        this.tarjetaPropiedadVehServiceHibernateImpl = tarjetaPropiedadVehServiceHibernateImpl;
    }

    
    public String getEstadoVehiculo() {
        return estadoVehiculo;
    }

    public void setEstadoVehiculo(String estadoVehiculo) {
        this.estadoVehiculo = estadoVehiculo;
    }

    public String getKm() {
        return km ;
    }

    public void setKm(String km) {
        this.km = km;
    }
    
    public String getNombresPropietario() {
        return nombresPropietario;
    }

    public void setNombresPropietario(String nombresPropietario) {
        this.nombresPropietario = nombresPropietario;
    }
    
    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }
    
    public String getObservacionesCreditos() {
        return observacionesCreditos;
    }

    public void setObservacionesCreditos(String observacionesCreditos) {
        this.observacionesCreditos = observacionesCreditos;
    }

    public String getDiasMeses() {
        return diasMeses;
    }

    public void setDiasMeses(String diasMeses) {
        this.diasMeses = diasMeses;
    }

    public String getFechaPactada() {
        return fechaPactada;
    }

    public void setFechaPactada(String fechaPactada) {
        this.fechaPactada = fechaPactada;
    }

    public int getPactado() {
        return pactado;
    }

    public void setPactado(int pactado) {
        this.pactado = pactado;
    }

    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    public Short getIdTipoDeDocumento() {
        return idTipoDeDocumento;
    }

    public void setIdTipoDeDocumento(Short idTipoDeDocumento) {
        this.idTipoDeDocumento = idTipoDeDocumento;
    }

    public List<SelectItem> getListaTiposDeDocumentosSelectItem() {
        return listaTiposDeDocumentosSelectItem;
    }

    public void setListaTiposDeDocumentosSelectItem(List<SelectItem> listaTiposDeDocumentosSelectItem) {
        this.listaTiposDeDocumentosSelectItem = listaTiposDeDocumentosSelectItem;
    }

    public Short getIdNotaria() {
        return idNotaria;
    }

    public void setIdNotaria(Short idNotaria) {
        this.idNotaria = idNotaria;
    }

    public List<SelectItem> getListaNotariasSelectItem() {
        return listaNotariasSelectItem;
    }

    public void setListaNotariasSelectItem(List<SelectItem> listaNotariasSelectItem) {
        this.listaNotariasSelectItem = listaNotariasSelectItem;
    }

    public List<TMonedas> getListaBeansMonedas() {
        return listaBeansMonedas;
    }

    public void setListaBeansMonedas(List<TMonedas> listaBeansMonedas) {
        this.listaBeansMonedas = listaBeansMonedas;
    }

    public MonedasServiceHibernate getMonedasServiceHibernateImpl() {
        return monedasServiceHibernateImpl;
    }

    public void setMonedasServiceHibernateImpl(MonedasServiceHibernate monedasServiceHibernateImpl) {
        this.monedasServiceHibernateImpl = monedasServiceHibernateImpl;
    }

    public MontoInteresServiceHibernate getMontoInteresServiceHibernateImpl() {
        return montoInteresServiceHibernateImpl;
    }

    public void setMontoInteresServiceHibernateImpl(MontoInteresServiceHibernate montoInteresServiceHibernateImpl) {
        this.montoInteresServiceHibernateImpl = montoInteresServiceHibernateImpl;
    }

    public BigDecimal getInteresQuincenal() {
        return interesQuincenal;
    }

    public void setInteresQuincenal(BigDecimal interesQuincenal) {
        this.interesQuincenal = interesQuincenal;
    }

    public BigDecimal getInteresMensual() {
        return interesMensual;
    }

    public void setInteresMensual(BigDecimal interesMensual) {
        this.interesMensual = interesMensual;
    }

    public BigDecimal getCuotaQuincenal() {
        return cuotaQuincenal;
    }

    public void setCuotaQuincenal(BigDecimal cuotaQuincenal) {
        this.cuotaQuincenal = cuotaQuincenal;
    }

    public BigDecimal getCuotaMensual() {
        return cuotaMensual;
    }

    public void setCuotaMensual(BigDecimal cuotaMensual) {
        this.cuotaMensual = cuotaMensual;
    }

    public BigDecimal getGuardianiaOtros() {
        return guardianiaOtros;
    }

    public void setGuardianiaOtros(BigDecimal guardianiaOtros) {
        this.guardianiaOtros = guardianiaOtros;
    }

    public List<SelectItem> getListaMonedasSelectItem() {
        return listaMonedasSelectItem;
    }

    public void setListaMonedasSelectItem(List<SelectItem> listaMonedasSelectItem) {
        this.listaMonedasSelectItem = listaMonedasSelectItem;
    }

    public Short getIdMoneda() {
        return idMoneda;
    }

    public void setIdMoneda(Short idMoneda) {
        this.idMoneda = idMoneda;
    }

    public BigDecimal getMontoPrestamo() {
        return montoPrestamo;
    }

    public void setMontoPrestamo(BigDecimal montoPrestamo) {
        this.montoPrestamo = montoPrestamo;
    }

    public Utileria getUtileria() {
        return utileria;
    }

    public void setUtileria(Utileria utileria) {
        this.utileria = utileria;
    }

    public String getsDolarCompraModal() {
        return sDolarCompraModal;
    }

    public void setsDolarCompraModal(String sDolarCompraModal) {
        this.sDolarCompraModal = sDolarCompraModal;
    }

    public String getsDolarVentaModal() {
        return sDolarVentaModal;
    }

    public void setsDolarVentaModal(String sDolarVentaModal) {
        this.sDolarVentaModal = sDolarVentaModal;
    }

    public String getColorMensajeDolar() {
        return colorMensajeDolar;
    }

    public void setColorMensajeDolar(String colorMensajeDolar) {
        this.colorMensajeDolar = colorMensajeDolar;
    }

    public String getMensajeDolar() {
        return mensajeDolar;
    }

    public void setMensajeDolar(String mensajeDolar) {
        this.mensajeDolar = mensajeDolar;
    }

    public TCambioDolar getCambioDolar() {
        return cambioDolar;
    }

    public void setCambioDolar(TCambioDolar cambioDolar) {
        this.cambioDolar = cambioDolar;
    }

    public CambioDolarServiceHibernate getCambioDolarServiceHibernateImpl() {
        return cambioDolarServiceHibernateImpl;
    }

    public void setCambioDolarServiceHibernateImpl(CambioDolarServiceHibernate cambioDolarServiceHibernateImpl) {
        this.cambioDolarServiceHibernateImpl = cambioDolarServiceHibernateImpl;
    }

    public BigDecimal getDolarCompra() {
        return dolarCompra;
    }

    public void setDolarCompra(BigDecimal dolarCompra) {
        this.dolarCompra = dolarCompra;
    }

    public BigDecimal getDolarVenta() {
        return dolarVenta;
    }

    public void setDolarVenta(BigDecimal dolarVenta) {
        this.dolarVenta = dolarVenta;
    }

    public List<TCambioDolar> getListCambioDolar() {
        return listCambioDolar;
    }

    public void setListCambioDolar(List<TCambioDolar> listCambioDolar) {
        this.listCambioDolar = listCambioDolar;
    }

    public Integer getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Integer idCliente) {
        this.idCliente = idCliente;
    }

    public ClienteServiceHibernate getClienteServiceHibernateImpl() {
        return clienteServiceHibernateImpl;
    }

    public void setClienteServiceHibernateImpl(ClienteServiceHibernate clienteServiceHibernateImpl) {
        this.clienteServiceHibernateImpl = clienteServiceHibernateImpl;
    }

    public String getColorMensajeCredito() {
        return colorMensajeCredito;
    }

    public void setColorMensajeCredito(String colorMensajeCredito) {
        this.colorMensajeCredito = colorMensajeCredito;
    }

    public Integer getDni() {
        return dni;
    }

    public void setDni(Integer dni) {
        this.dni = dni;
    }

    public String getMensajeCredito() {
        return mensajeCredito;
    }

    public void setMensajeCredito(String mensajeCredito) {
        this.mensajeCredito = mensajeCredito;
    }

    public String getColorMensajeExisteCte() {
        return colorMensajeExisteCte;
    }

    public void setColorMensajeExisteCte(String colorMensajeExisteCte) {
        this.colorMensajeExisteCte = colorMensajeExisteCte;
    }

    public String getMensajeExisteCte() {
        return mensajeExisteCte;
    }

    public void setMensajeExisteCte(String mensajeExisteCte) {
        this.mensajeExisteCte = mensajeExisteCte;
    }

    public String getFechaActual() {
        return fechaActual;
    }

    public void setFechaActual(String fechaActual) {
        this.fechaActual = fechaActual;
    }

    public String getApeMaterno() {
        return apeMaterno;
    }

    public void setApeMaterno(String apeMaterno) {
        this.apeMaterno = apeMaterno;
    }

    public String getApePaterno() {
        return apePaterno;
    }

    public void setApePaterno(String apePaterno) {
        this.apePaterno = apePaterno;
    }

    public String getNomCliente() {
        return nomCliente;
    }

    public void setNomCliente(String nomCliente) {
        this.nomCliente = nomCliente;
    }

    public String getRuc() {
        return ruc;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    //De la ventana Modal
    public void buscaClienteDNI(ActionEvent event) {
        this.buscaCliente(1);
    }

    //De la ventana Modal
    public void buscaClienteRUC() {
        this.buscaCliente(2);
    }
        
    private void buscaCliente(int opcion) {
        
        List<TClientes> resultado;
        String dato;

        if (opcion == 1)//x DNI
        {
            resultado = this.getClienteServiceHibernateImpl().findByDNICliente(this.dni);
            dato = "DNI";
            //this.ruc = null;//para que no se muestre en la vista 
            
        } else //x RUC
        {
            resultado = this.getClienteServiceHibernateImpl().findByRUCCliente(this.ruc);
            dato = "RUC";
            //this.dni = null;
        }

        TClientes cliente;
        Integer coincidencias = resultado.size();// comun a dni y ruc

        if (coincidencias == 1) //Solo debe traer un objeto Cte.
        {
            cliente = resultado.get(0);
            this.nomCliente = cliente.getVNombreCte();
            this.apePaterno = cliente.getVApePaternoCte();
            this.apeMaterno = cliente.getVApeMaternoCte();
            this.idCliente = cliente.getNIdCtePk();

            this.mensajeExisteCte = "";

        } else if (coincidencias == 0) {
            this.mensajeExisteCte = "Error " + dato + " No Encontrado";
            this.colorMensajeExisteCte = "red";

            //this.nomCliente = "";
            //this.apePaterno = "";
            //this.apeMaterno = "";
        } else //mas de una coincidencia
        {
            this.mensajeExisteCte = "Error " + dato + " Repetido varias veces";
            this.colorMensajeExisteCte = "red";
        }
    }

    //Viene de la vista de la ventana Modal
    public void actualizarCambioDolar(ActionEvent event) {
        this.actualizarCambioDolar(); //sobrecarga
    }
    
    public void calcularIntereses(ActionEvent event) {
        //En la BD esta en Soles , por lo tanto si se escoge en Dolares se debe hacer el cambio a Soles al tipo de la Venta
        
        TMontoInteres objMontInte;
        List<TMontoInteres> listaBeansMontoInteres = null;   
        BigDecimal cien, intQuincenalCalculado, intMensualCalculado, montoPrestamoEnSoles;
        cien = BigDecimal.valueOf(100);      
        montoPrestamoEnSoles = BigDecimal.valueOf(0);//Pide inicializar
        
        if(this.idMoneda == 1 ) //Si esta en Soles
        {  
           listaBeansMontoInteres = this.montoInteresServiceHibernateImpl.findMontoInteresServiceHibernate(this.montoPrestamo);
        }
        else if(this.idMoneda == 2) //En Dolares 
        {            
            montoPrestamoEnSoles = this.dolarVenta.multiply(this.montoPrestamo);  
            listaBeansMontoInteres = this.montoInteresServiceHibernateImpl.findMontoInteresServiceHibernate(montoPrestamoEnSoles);
        }        
        
        objMontInte = listaBeansMontoInteres.get(0);//Solo debe traer un objeto
        this.interesQuincenal = objMontInte.getNInteresQuincenal();//Vista
        this.interesMensual = objMontInte.getNInteresMensual();//Vista

        intQuincenalCalculado = this.interesQuincenal.divide(cien);
        intMensualCalculado = this.interesMensual.divide(cien);
        
        //Tanto para Soles como para Dolares
        this.cuotaQuincenal = intQuincenalCalculado.multiply(this.montoPrestamo);//Vista
        this.cuotaMensual = intMensualCalculado.multiply(this.montoPrestamo);//Vista    
        
       
        
    }  
    

    //actualiza el nuevo cambio de Dolar en la BD si los datos de formato de numero son validos (dolar)
    private void actualizarCambioDolar() {
        Integer flag1 = 0;
        Integer flag2 = 0;

        flag1 = verificaDolar(this.sDolarVentaModal); //sDolarVentaModal es de la vista de la ventana Modal -> que tenga 1 solo punto, 
                                                  //tratar de hacer esto en el formulario cte Modal a traves de java script
        flag2 = verificaDolar(this.sDolarCompraModal);

        if (flag1 == 1 && flag2 == 1)//correcto
        {
            
            this.dolarVenta = new BigDecimal(this.sDolarVentaModal); //Para la vista, en el form principal
            this.dolarCompra = new BigDecimal(this.sDolarCompraModal); //Para la vista, en el form principal
            
            this.cambioDolar = new TCambioDolar();

            Short id = Short.valueOf("1"); //Id de cambio de Dolar, solo existe 1 registro con Id 1

            this.cambioDolar.setNIdCambioMonedaPk(id);
            this.cambioDolar.setNCambioVenta(this.dolarVenta);
            this.cambioDolar.setNCambioCompra(this.dolarCompra);

            this.cambioDolarServiceHibernateImpl.saveOrUpdateCambioDolar(this.cambioDolar);//En BD

            this.mensajeDolar = "Tipo de Cambio del Dolar actualizado correctamente";
            this.colorMensajeDolar = "green";
        } else {
            //Se queda con el cambio de dolar que se trajo al inicio a traves del constructor
            this.mensajeDolar = "Error al actualizadar el Tipo de Cambio del Dolar, Formato de Numero (No se admiten valores en blanco y como maximo 1 punto)";
            this.colorMensajeDolar = "red";
        }

    }

    //Devuelve 1 -> si no esta en blanco y si es  mayor a 0 y si solo tiene un pto como maximo
    private Integer verificaDolar(String sDolar) {
        int flag = 0;

        //vacia y quita espacios en blanco x referencia
        flag = this.utileria.es_cadena_No_Vacia(sDolar);

        if (flag == 0) {
            return 0;
        }

        //Menos de 2 puntos decimales
        flag = this.utileria.puntos_Decimales(sDolar);

        if (flag == 0) {
            return 0;
        }

        //Si no esta en blanco y no tiene mas de un punto decimal recien convertimos a BigDecimal
        //para verificar que sea mayor a 0
        flag = this.utileria.mayor_a_Cero(sDolar);

        if (flag == 0) {
            return 0;
        }

        return 1;
    }
    
    //se obtienen los registros del cambio de dolar de la BD
    private void traerCambioDolar() {
        this.listCambioDolar = this.cambioDolarServiceHibernateImpl.findCambioDolar();
        this.cambioDolar = listCambioDolar.get(0);//solo debe existor un registro

        //para el Form principal de la vista
        this.dolarVenta = this.cambioDolar.getNCambioVenta();
        this.dolarCompra = this.cambioDolar.getNCambioCompra();

        //para la Ventana Modal de la vista
        this.sDolarVentaModal = String.valueOf(this.dolarVenta);        
        this.sDolarCompraModal = String.valueOf(this.dolarCompra);

        this.dni = null; //ya que es numerico

    }
    
    //De la ventana Modal
    public void buscaAutoxPlaca(ActionEvent event) {
        this.buscaAutoxPlaca();
    }

     private void buscaAutoxPlaca()
     {
         Integer coincidencias1, coincidencias2 = 0;
         //Limpiamos todos los datos de la vista Modal, para que limpie x si existe alguna coincidencia anterior.
        this.nombresPropietario = "";
        this.estadoVehiculo = "";
        this.km = "";
         
        //String a;
        String placaMayus = this.getPlaca().trim().toUpperCase();
        //Buscamos x Placa Nueva y/o Antigua
        //1ro Buscamos x la placa Nueva, maximo debe devolver 1 registro
        this.listTarjetaPropiedadVeh = this.tarjetaPropiedadVehServiceHibernateImpl.findByVPlacaVehiculoActual(placaMayus);
        
        coincidencias1 = this.listTarjetaPropiedadVeh.size();
        
        //Si no encontro x Placa Nueva busca x placa Antigua, maximo debe devolver 1 registro
        if(coincidencias1 == 0)
        {
            this.listTarjetaPropiedadVeh = this.tarjetaPropiedadVehServiceHibernateImpl.findByVPlacaVehiculoAntigua(placaMayus);
            coincidencias2 = this.listTarjetaPropiedadVeh.size();
            
        }
        
        //Si no encontro ni Placa Nueva ni Antigua
        if(coincidencias1 == 0 && coincidencias2 ==0)
        {
            this.estadoVehiculo = "SIN COINCIDENCIAS";
        }
        else
            this.estadoVehiculo = "CONNNN COINCIDENCIAS";
               
         
     }

}
